package com.example.service;

import com.example.common.enums.RoleEnum;
import com.example.entity.Account;
import com.example.entity.Classes;
import com.example.entity.Student;
import com.example.mapper.ClassesMapper;
import com.example.utils.TokenUtils;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;

import jakarta.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 班级信息表业务处理
 **/
@Service
public class ClassesService {

    @Resource
    private ClassesMapper classesMapper;

    /**
     * 新增
     * 权限控制：只有管理员可以新增班级
     */
    public void add(Classes classes) {
        Account currentUser = TokenUtils.getCurrentUser();
        if (currentUser != null && !RoleEnum.ADMIN.name().equals(currentUser.getRole())) {
            throw new com.example.exception.CustomException(com.example.common.enums.ResultCodeEnum.NO_AUTH);
        }
        classesMapper.insert(classes);
    }

    /**
     * 删除
     * 权限控制：只有管理员可以删除班级
     */
    public void deleteById(Integer id) {
        Account currentUser = TokenUtils.getCurrentUser();
        if (currentUser != null && !RoleEnum.ADMIN.name().equals(currentUser.getRole())) {
            throw new com.example.exception.CustomException(com.example.common.enums.ResultCodeEnum.NO_AUTH);
        }
        classesMapper.deleteById(id);
    }

    /**
     * 批量删除
     * 权限控制：只有管理员可以批量删除班级
     */
    public void deleteBatch(List<Integer> ids) {
        Account currentUser = TokenUtils.getCurrentUser();
        if (currentUser != null && !RoleEnum.ADMIN.name().equals(currentUser.getRole())) {
            throw new com.example.exception.CustomException(com.example.common.enums.ResultCodeEnum.NO_AUTH);
        }
        // 使用 Java 21 增强的 Stream API
        ids.forEach(classesMapper::deleteById);
    }
    /**
     * 修改
     * 权限控制：只有管理员可以修改班级
     */
    public void updateById(Classes classes) {
        Account currentUser = TokenUtils.getCurrentUser();
        if (currentUser != null && !RoleEnum.ADMIN.name().equals(currentUser.getRole())) {
            throw new com.example.exception.CustomException(com.example.common.enums.ResultCodeEnum.NO_AUTH);
        }
        classesMapper.updateById(classes);
    }

    /**
     * 根据ID查询
     */
    public Classes selectById(Integer id) {
        return classesMapper.selectById(id);
    }

    /**
     * 查询所有
     * 添加权限控制：学生只能查看自己所在的班级，教师只能查看自己管理的班级
     */
    public List<Classes> selectAll(Classes classes) {
        List<Classes> list = classesMapper.selectAll(classes);
        
        // 获取当前登录用户
        Account currentUser = TokenUtils.getCurrentUser();
        if (currentUser != null) {
            if (RoleEnum.STUDENT.name().equals(currentUser.getRole())) {
                // 学生只能看到自己所在的班级
                Student student = (Student) currentUser;
                return list.stream()
                        .filter(c -> c.getId().equals(student.getClassId()))
                        .collect(Collectors.toList());
            } else if (RoleEnum.TEACHER.name().equals(currentUser.getRole())) {
                // 教师只能看到自己担任班主任的班级
                return list.stream()
                        .filter(c -> c.getTeacherId() != null && c.getTeacherId().equals(currentUser.getId()))
                        .collect(Collectors.toList());
            }
        }
        
        // 管理员可以看到所有班级
        return list;
    }

    /**
     * 分页查询
     * 添加权限控制：学生只能查看自己所在的班级，教师只能查看自己管理的班级
     */
    public PageInfo<Classes> selectPage(Classes classes, Integer pageNum, Integer pageSize) {
        // 获取当前登录用户
        Account currentUser = TokenUtils.getCurrentUser();
        if (currentUser != null) {
            if (RoleEnum.STUDENT.name().equals(currentUser.getRole())) {
                // 学生只能看到自己所在的班级
                Student student = (Student) currentUser;
                classes.setId(student.getClassId());
            } else if (RoleEnum.TEACHER.name().equals(currentUser.getRole())) {
                // 教师只能看到自己担任班主任的班级
                classes.setTeacherId(currentUser.getId());
            }
        }
        
        PageHelper.startPage(pageNum, pageSize);
        List<Classes> list = classesMapper.selectAll(classes);
        return PageInfo.of(list);
    }

}
